package com.itttq.gshop.bbpm.schedule;

import java.util.Calendar;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.itttq.gshop.generic.connector.IOrderInfoConnector;
import com.itttq.gshop.generic.util.Constants.OrderStatus;

/**
 * 定时处理订单相关：取消订单。<br>
 * 目前是每30分钟跑一次，可能出现的问题，是订单在30~60分钟内取消。后续改为缓存，实现真正的按时执行。
 * @ClassName:  OrderHandleTask
 * @author: 迷蝶
 * @date:   2018年1月27日 下午12:15:45 
 *     
 * @Copyright: 2018 <a href="www.itttq.com" target="_blank">www.itttq.com</a> Inc. All rights reserved.
 */
@Component
public class OrderHandleTask {
	@Autowired
	private IOrderInfoConnector orederCpnnector;
	// 记录订单取消的时间间隔，单位为分钟
	public static Date cancelTime;
	@Value("${gshop.bbpm.order.cancelTime}")
	public void setCancelTime(Integer time) {
		// 根据配置的时间，计算应该取消订单的时间
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.MINUTE, -(null == time ? 30 : time));
		cancelTime = cal.getTime();
	}
	
    /**
     * 定时取消未支付的订单。
     * 定时注解说明：
     * @Scheduled(fixedRate = 5000) ：上一次开始执行时间点之后5秒再执行
     * @Scheduled(fixedDelay = 5000) ：上一次执行完毕时间点之后5秒再执行
     * @Scheduled(initialDelay=1000, fixedRate=5000) ：第一次延迟1秒后执行，之后按fixedRate的规则每5秒执行一次
     * @Scheduled(cron="  /5   ") ：通过cron表达式定义规则
     * 
     * @Author 迷蝶
     * @return void
     */
    @Scheduled(cron = "${gshop.bbpm.task.cron}")
    public void cancelOreder() {
    	orederCpnnector.updateOrderStatusByTime(OrderStatus.CANCELED.getVal(), OrderStatus.UNPAID.getVal(), cancelTime);
    }
}